package com.wl.dzt.sys.util;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;


/**
 * @author wl_code@163.com
 * @version 1.0
 * @date 2018/7/13/013
 * @description 集合工具
 * 
 */
public class CollectionUtils {

	/**
	 * 当集合第一个元素为空时候赋新值
	 * 
	 * @param src
	 *            集合
	 * @param thenEmpty
	 *            新值
	 * @return 泛型结果
	 */
	public static <T> T emptyOrFrist(Collection<T> src, Object thenEmpty) {
		return src.size() == 0 ? (T) thenEmpty : src.iterator().next();
	}

	/**
	 * 转换为数组
	 * 
	 * @param collection
	 *            集合
	 * @param clazz
	 *            类
	 * @return 转换后的数组
	 */
	public static <T> T[] toArray(Collection<T> collection, Class<T> clazz) {
		if (collection == null) {
			return null;
		}
		T[] ts = (T[]) Array.newInstance(clazz, collection.size());
		return collection.toArray(ts);
	}

	/**
	 * 将集合转换为字符串元素之间用指定符号连接
	 * 
	 * @param collection
	 *            集合
	 * @param delimiter
	 *            连接符号
	 * @return 转换后的数组
	 */
	public static String join(Collection<?> collection, String delimiter) {
		if (collection == null || collection.isEmpty())
			return "";
		StringBuilder builder = new StringBuilder();
		collection.forEach(obj -> builder.append(obj + delimiter));
		int last = builder.lastIndexOf(delimiter);
		return builder.delete(last, builder.length()).toString();
	}

	/**
	 * 根据某个字段join
	 * 
	 * @param collection
	 *            集合
	 * @param field
	 *            字段
	 * @param delimiter
	 *            连接符
	 * @return 字符串
	 */
	public static String joinByFiled(Collection<? extends Map<?, ?>> collection, String field, String delimiter) {
		List<Object> list = new ArrayList<>();
		collection.forEach(obj -> list.add(obj.get(field)));
		return join(list, delimiter);
	}
	/**
	 * 把一个集合中根据指定的字段把这些字段的值通过指定的符号关联起来
	 *
	 * @param collection
	 * @param field
	 * @param delimiter
	 * @return
	 */
	public static String joinByFiledForList(Collection<? extends List<?>> collection, String field, String delimiter) {
		List<Object> list = new ArrayList<>();
		collection.forEach(obj -> list.add(FieldUtil.doGetMethod(obj, field)));
		return join(list, delimiter);
	}

	/**
	 * 将map类型的集合中的某一个字段转换集合
	 * 
	 * @param collection
	 *            集合
	 * @param field
	 *            字段
	 * @return 转换后的字符串集合
	 */
	public static List<String> toFiled(Collection<Map<String, Object>> collection, String field) {
		List<String> data = new ArrayList<>();
		collection.forEach(map -> {
			Object obj = map.get(field);
			if (obj != null) {
				data.add(obj.toString());
			}
		});
		return data;
	}
}
